home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / make / src / lib.c < prev    next >
Text File  |  1994-06-13  |  5KB  |  236 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <string.h>
  4. #include    <ctype.h>
  5. #ifndef    UNIX
  6. #include    <jctype.h>
  7. #include    <dos.h>
  8. #endif
  9. #include    "defs.h"
  10.  
  11. #ifndef    UNIX
  12.  
  13. #ifdef    LSIC
  14. int    _dos_findfirst(char *file, int mod, struct find_t *dma)
  15. {
  16.     union REGS regs;
  17.     struct SREGS seg;
  18.     char far *p;
  19.  
  20.     p = (char far *)dma;
  21.     regs.h.ah = 0x1a;
  22.     seg.ds = FP_SEG(p);
  23.     regs.x.dx = FP_OFF(p);
  24.     intdosx(®s, ®s, &seg);
  25.  
  26.     p = (char far *)file;
  27.     regs.h.ah = 0x4e;
  28.     regs.x.cx = mod;
  29.     seg.ds = FP_SEG(p);
  30.     regs.x.dx = FP_OFF(p);
  31.     intdosx(®s, ®s, &seg);
  32.     return ((regs.x.flags & 1) ? ERR : FALSE);
  33. }
  34. int    _dos_findnext(struct find_t *dma)
  35. {
  36.     union REGS regs;
  37.  
  38.     regs.h.ah = 0x4F;
  39.     intdos(®s, ®s);
  40.     return ((regs.x.flags & 1) ? ERR : FALSE);
  41. }
  42. char    *strdup(char *str)
  43. {
  44.     char    *p;
  45.  
  46.     if ( (p = (char *)malloc(strlen(str) + 1)) != NULL )
  47.     strcpy(p, str);
  48.     return p;
  49. }
  50. #endif
  51.  
  52. int    strlcmp(char *s, char *p)
  53. {
  54.     int c;
  55.  
  56.     for ( ; ; ) {
  57.     if ( (c = tolower(*s) - tolower(*p)) != 0 )
  58.         return c;
  59.     if ( *s == '\0' )
  60.         return 0;
  61.     s++;
  62.     p++;
  63.     }
  64. }
  65. char    *strlcpy(char *s, char *p)
  66. {
  67.     char *q = s;
  68.  
  69.     while ( *p != '\0' ) {
  70.     if ( iskanji(p[0]) && iskanji2(p[1]) ) {
  71.         *(q++) = *(p++);
  72.         *(q++) = *(p++);
  73.     } else {
  74.         *(q++) = tolower(*p);
  75.         p++;
  76.     }
  77.     }
  78.     *q = '\0';
  79.     return s;
  80. }
  81.  
  82. static    char    *wild_ptr = NULL;
  83. static    char    wild_buf[STRLEN + 2];
  84. static    struct find_t dma;
  85.  
  86. char    *wild_file(char *file)
  87. {
  88.     if ( wild_ptr == NULL ) {
  89.     strcpy(wild_buf, file);
  90.     if ( (wild_ptr = strrchr(wild_buf, '\\')) != NULL ||
  91.          (wild_ptr = strrchr(wild_buf, ':')) != NULL )
  92.         wild_ptr += 1;
  93.     else
  94.         wild_ptr = wild_buf;
  95.  
  96.     if ( _dos_findfirst(file, 0x21, &dma) ) {
  97.         wild_ptr = NULL;
  98.         return NULL;
  99.     }
  100.  
  101.     } else if ( _dos_findnext(&dma) ) {
  102.     wild_ptr = NULL;
  103.     return NULL;
  104.     }
  105.  
  106.     strlcpy(wild_ptr, dma.name);
  107.     return wild_buf;
  108. }
  109.  
  110. int    execute(int sh, char *cmd)
  111. {
  112.     int n;
  113.     int ac = 0;
  114.     char *p;
  115.     char *av[ARG_MAX + 1];
  116.     static char *dos[] = {
  117.         "cd",    "chdir", "cls",  "copy",  "ctty",
  118.         "date",  "del",   "dir",  "echo",  "erase",
  119.     "md",    "mkdir", "rd",   "ren",   "rename",
  120.     "rmdir", "time",  "type", "ver",   "verify",
  121.     "vol",   NULL
  122.     };
  123.     
  124.     if ( (p = get_env("SHELL")) == NULL ||
  125.      (p = get_env("COMSPEC")) == NULL )
  126.     p = "COMMAND.COM";
  127.  
  128.     av[ac++] = p;
  129.     av[ac++] = "/c";
  130.  
  131.     p = cmd;
  132.     while ( *p != '\0' ) {
  133.     while ( *p == ' ' || *p == '\t' )
  134.         p++;
  135.     if ( ac >= ARG_MAX ) {
  136.         fprintf(stderr, "arg overflow '%s'\n", p);
  137.         exit(2);
  138.     }
  139.     av[ac++] = p;
  140.     while ( *p != ' ' && *p != '\t' && *p != '\0' ) {
  141.         if ( *(p++) == '"' ) {
  142.         while ( *p != '"' && *p != '\0' )
  143.             p++;
  144.         }
  145.     }
  146.     if ( *p != '\0' )
  147.         *(p++) = '\0';
  148.     }
  149.     av[ac] = NULL;
  150.  
  151.     if ( sh == FALSE ) {
  152.     for ( n = 0 ; dos[n] != NULL ; n++ ) {
  153.         if ( strlcmp(dos[n], av[2]) == 0 ) {
  154.         sh = TRUE;
  155.         break;
  156.         }
  157.     }
  158.     }
  159.  
  160.     ac = (sh ? 0 : 2);
  161.     return spawnvp(0, av[ac], &(av[ac]));
  162. }
  163.  
  164.     char    *optarg = "";
  165.     int    optind = 1;
  166. static  char    *optstr = NULL;
  167.  
  168. char    *progname(char *prog)
  169. {
  170.     char    *p;
  171.  
  172.     if ( (p = strrchr(prog, ':')) != NULL )
  173.     prog = p + 1;
  174.     if ( (p = strrchr(prog, '\\')) != NULL )
  175.     prog = p + 1;
  176.     if ( (p = strrchr(prog, '/')) != NULL )
  177.     prog = p + 1;
  178.     for ( p = prog ; *p != '\0' ; p++ )
  179.     *p = tolower(*p);
  180.     if ( (p = strrchr(prog, '.')) != NULL && strcmp(p, ".exe") == 0 )
  181.     *p = '\0';
  182.     return prog;
  183. }
  184. int    getopt(ac, av, opt)
  185. int    ac;
  186. char    *av[];
  187. char    *opt;
  188. {
  189.     int     c;
  190.     char    *s;
  191.  
  192.     for ( ; ; ) {
  193.     if ( optstr != NULL && *optstr != '\0' ) {
  194.         s = opt;
  195.         while ( *s != '\0' ) {
  196.         if ( *(s++) == *optstr ) {
  197.             c = *(optstr++);
  198.             if ( *s == ':' ) {
  199.             s++;
  200.  
  201.             if ( *optstr == '=' )
  202.                 optstr++;
  203.  
  204.             if ( *optstr != '\0' )
  205.                 optarg = optstr;
  206.             else if ( optind < ac && *av[optind] != '-' )
  207.                 optarg = av[optind++];
  208.             else {
  209.                 fprintf(stderr,
  210.                 "%s: option `-%c' requires an argument\n",
  211.                 progname(av[0]), c);
  212.                 optstr = NULL;
  213.                 return '\0';
  214.             }
  215.  
  216.             optstr = NULL;
  217.             }
  218.             return c;
  219.         }
  220.         if ( *s == ':' )
  221.             s++;
  222.         }
  223.  
  224.         fprintf(stderr, "%s: unrecognized option `-%c'\n",
  225.                 progname(av[0]), *optstr);
  226.         return *(optstr++);
  227.     }
  228.  
  229.     if ( optind >= ac || *av[optind] != '-' )
  230.         return EOF;
  231.  
  232.     optstr = av[optind++] + 1;
  233.     }
  234. }
  235. #endif
  236.